import torch

x = 1.0
y = 2.0
w = torch.Tensor([1.0])
# 将变量w的requires_grad属性设置为True
# 启用自动梯度计算，使得PyTorch能够跟踪对该变量的所有操作
# 为后续的反向传播和参数优化做准备
# 通常用于训练神经网络时标记需要更新的参数
w.requires_grad = True


def forward(x):
    return x * w


def loss(x, y):
    y_pred = forward(x)
    return (y_pred - y) ** 2


l = loss(x, y)
# 调用 tensor.backward() 前，tensor.grad 为 None
# 只有启用了 requires_grad=True 的张量才能参与梯度计算
# backward() 会自动计算并填充 .grad 属性
l.backward()
print(l)
print(w.grad)
# 清零梯度：将张量 w 的梯度数据重置为0
# 就地操作：zero_() 是一个就地操作（in-place operation），直接修改原张量的值而不创建新张量
# 避免梯度累积：在训练神经网络时，通常需要在每个训练批次前清零梯度，防止梯度累积影响模型更新
w.grad.zero_()
print(w.grad)
